<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <input type="text" v-faker />
      <h1>{{name}}</h1>
    </div>
  </body>
</html>
<script src="http://chst.vip:8081/vue.js"></script>
<script>
  // 钩子函数：程序执行到某个阶段自行回调的函数就是钩子函数
  // vue2版本中 自定义钩子函数有3个 bind inserted update
  // 虚拟dom：本质就是使用js在内存中模拟真实dom树的嵌套，配合diff算法来实现页面的高效更新
  Vue.directive("faker", {
    //el 就是指令所在dom节点 可以通过el进行原生dom操作
    // binding 一个对象，包含以下属性：

    // `name`：指令名，不包括 `v-` 前缀。

    // `value`：指令的绑定值，例如：`v-my-directive="1 + 1"` 中，绑定值为 `2`。

    // `oldValue`：指令绑定的前一个值，仅在 `update` 和 `componentUpdated` 钩子中可用。无论值是否改变都可用。

    // `expression`：字符串形式的指令表达式。例如 `v-my-directive="goods"` 中，表达式为 `"goods"`。

    // `arg`：传给指令的参数，可选。例如 `v-my-directive:foo` 中，参数为 `"foo"`。

    // `modifiers`：一个包含修饰符的对象。例如：`v-my-directive.foo.bar` 中，修饰符对象为 `{ foo: true, bar: true }`。
    // - `vnode`：Vue 编译生成的虚拟节点(了解)

    //   - `oldVnode`：上一个虚拟节点，仅在 `update` 和 `componentUpdated` 钩子中可用。(了解)
    bind(el, binding) {
      // 没有父节点
      console.group("bind钩子");
      console.log(el.parentNode);
      console.log(el);
      console.log(binding);
      console.groupEnd();
    }, //指令第一次绑定到元素上的时候触发
    inserted(el) {
      console.group("inserted钩子");
      console.log(el);
      el.focus();
      console.log(el.parentNode);
      console.groupEnd();
    }, //指令所在dom元素，插入到父节点内部的时候触发
    update(el) {
      console.group("update钩子");
      console.log(el);
      console.groupEnd();
    }, //指令所在区间，虚拟dom更新的时候触发
  });
  const vm = new Vue({
    el: "#app",
    data: {
      name: "harry",
    },
  });
</script>
